package thread.noteplusss;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

@SuppressWarnings("all")
public class Server  {
    private ServerSocket serverSocket;
    private List<PrintWriter> allout =new ArrayList<>();
    public Server(){
        try {
            System.out.println("正在启动服务端");
            serverSocket = new ServerSocket(8080);
            System.out.println("服务端启动完毕");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void start(){
        try {
            while (true){
                System.out.println("等待客户端连接");
                Socket socket = serverSocket.accept();
                System.out.println("一个客户端连接上了");
                Thread thread = new Thread(new ClientHandler(socket));
                thread.start();

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Server server = new Server();
        server.start();
    }
    public class ClientHandler implements Runnable{

    private Socket socket;
    private String host;

    public ClientHandler(Socket socket){
        this.socket = socket;
        host = socket.getInetAddress().getHostAddress();
    }
    @Override
    public void run(){
        PrintWriter printWriter=null;
        try {
            InputStream in = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(in,StandardCharsets.UTF_8);
            BufferedReader br = new BufferedReader(isr);
            OutputStream outputStream = socket.getOutputStream();
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream,StandardCharsets.UTF_8);
            BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
            printWriter = new PrintWriter(bufferedWriter, true);
            synchronized (allout) {
                allout.add(printWriter);
            }
            sendMessage(host+"上线了"+allout.size());
            String message;
            while ((message=br.readLine())!=null){
               sendMessage(host+"说:"+message);
            }
        } catch (IOException e) {

        }finally {
            synchronized (allout

            ) {
                allout.remove(printWriter);
            }
            sendMessage(host+"下线了:"+allout.size());
        }
    }

    private void sendMessage(String message){
        System.out.println(host+"说："+message);
        synchronized (allout) {
            for (PrintWriter o: allout
            ) {
                o.println(message);
            }
        }
    }
}

}